package coba.mailing.mail;

import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.LinkedList;
import java.util.List;

import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.HtmlEmail;

import coba.mailing.body.Body2;
import coba.mailing.function.NextXday;
import coba.mailing.jdbc.ConnectionFactory;
import coba.mailing.model.FormularioCoordinador;
import coba.mailing.model.FormularioParticipante;
import coba.mailing.model.Guia;
import coba.mailing.model.Solicitud;
import coba.mailing.procedure.AddAllCC;
import coba.mailing.procedure.AddAllTo;
import coba.mailing.properties.MainProperties;
import coba.mailing.query.FindFormularioCoordinadorBySolicitudId;
import coba.mailing.query.FindFormularioParticipanteBySolicitudId;
import coba.mailing.query.FindGuiaBySolicitudId;
import coba.mailing.query.FindSolicitudConfirmadaWhereModalidadAndFechaItinerarioBetween;

public class Mail2 {

	public static void send() throws ClassNotFoundException, IOException, SQLException, EmailException {
		Connection con = ConnectionFactory.getConnection();

		Calendar today0Hour = GregorianCalendar.getInstance();

		today0Hour.set(Calendar.HOUR_OF_DAY, 0);
		today0Hour.set(Calendar.MINUTE, 0);
		today0Hour.set(Calendar.SECOND, 0);
		today0Hour.set(Calendar.MILLISECOND, 0);

		Date mondayNextWeek = NextXday.nextXday(Calendar.MONDAY, today0Hour.getTime());
		Date saturdayNextWeek = NextXday.nextXday(Calendar.SATURDAY, mondayNextWeek);

		/*
		 * Solicitudes de la proxima semana
		 */
		List<Solicitud> listSolicitudModalidadAB = FindSolicitudConfirmadaWhereModalidadAndFechaItinerarioBetween.find(con, "A", mondayNextWeek, saturdayNextWeek);
		listSolicitudModalidadAB.addAll(FindSolicitudConfirmadaWhereModalidadAndFechaItinerarioBetween.find(con, "B", mondayNextWeek, saturdayNextWeek));
		List<Solicitud> listSolicitudModalidadD = FindSolicitudConfirmadaWhereModalidadAndFechaItinerarioBetween.find(con, "D", mondayNextWeek, saturdayNextWeek);

		if (!listSolicitudModalidadAB.isEmpty()) {
			send("AB",
					mondayNextWeek,
					saturdayNextWeek,
					calcularListListEspecificacionesAlimenticias(con, "AB", listSolicitudModalidadAB),
					calcularListComidaEstandar(con, "AB", listSolicitudModalidadAB));
		}

		if (!listSolicitudModalidadD.isEmpty()) {
			send("D",
					mondayNextWeek,
					saturdayNextWeek,
					calcularListListEspecificacionesAlimenticias(con, "D", listSolicitudModalidadD),
					calcularListComidaEstandar(con, "D", listSolicitudModalidadD));
		}

		con.close();
	}

	private static List<Long> calcularListComidaEstandar(Connection con, String modalidad, List<Solicitud> listSolicitud) throws SQLException {

		List<Long> listComidaEstandar = new LinkedList<Long>();

		for (int i = 0; i < 7; i ++) {
			listComidaEstandar.add(0L);
		}

		for (Solicitud solicitud : listSolicitud) {

			Calendar calFechaItinerario = GregorianCalendar.getInstance();
			calFechaItinerario.setTime(solicitud.getFechaItinerario());
			int diaDeLaSemana = calFechaItinerario.get(Calendar.DAY_OF_WEEK) - 1;

			List<FormularioParticipante> listFormularioParticipante = FindFormularioParticipanteBySolicitudId.find(con, solicitud.getSolicitudId());

			for (FormularioParticipante fp : listFormularioParticipante) {
				if (modalidad.equals("D") ||
						fp.getEspecificacionesAlimenticias() == null ||
						fp.getEspecificacionesAlimenticias().trim().equals("")) {
					Long cantidad = listComidaEstandar.get(diaDeLaSemana);
					listComidaEstandar.set(diaDeLaSemana, cantidad.longValue() + 1);
				}
			}

			List<FormularioCoordinador> listFormularioCoordinador = FindFormularioCoordinadorBySolicitudId.find(con, solicitud.getSolicitudId());
			listComidaEstandar.set(diaDeLaSemana, listComidaEstandar.get(diaDeLaSemana).longValue() + listFormularioCoordinador.size());

			List<Guia> listGuia = FindGuiaBySolicitudId.find(con, solicitud.getSolicitudId());
			listComidaEstandar.set(diaDeLaSemana, listComidaEstandar.get(diaDeLaSemana).longValue() + listGuia.size());

		}

		return listComidaEstandar;

	}

	private static List<List<String>> calcularListListEspecificacionesAlimenticias(Connection con, String modalidad, List<Solicitud> listSolicitud) throws SQLException {

		List<List<String>> listListEspecificacionesAlimenticias = new LinkedList<List<String>>();

		for (int i = 0; i < 7; i ++) {
			listListEspecificacionesAlimenticias.add(new LinkedList<String>());
		}

		for (Solicitud solicitud : listSolicitud) {

			Calendar calFechaItinerario = GregorianCalendar.getInstance();
			calFechaItinerario.setTime(solicitud.getFechaItinerario());
			int diaDeLaSemana = calFechaItinerario.get(Calendar.DAY_OF_WEEK) - 1;

			List<FormularioParticipante> listFormularioParticipante = FindFormularioParticipanteBySolicitudId.find(con, solicitud.getSolicitudId());

			for (FormularioParticipante fp : listFormularioParticipante) {
				if (!modalidad.equals("D") &&
						fp.getEspecificacionesAlimenticias() != null &&
						!fp.getEspecificacionesAlimenticias().trim().equals("")) {
					listListEspecificacionesAlimenticias.get(diaDeLaSemana).
							add(fp.getEspecificacionesAlimenticias());
				}
			}

		}

		return listListEspecificacionesAlimenticias;

	}

	public static void send(String modalidad, Date monday, Date saturday, List<List<String>> listListEspecificacionesAlimenticias, List<Long> listComidaEstandar) throws EmailException, IOException {
		MainProperties mainProperties = MainProperties.getInstance();

		HtmlEmail email = new HtmlEmail();

		email.setCharset("utf-8");
		email.setHostName(mainProperties.getProperty("smtpServer"));
		email.setSmtpPort(Integer.valueOf(mainProperties.getProperty("smtpPort")));

		email.setFrom(mainProperties.getProperty("fromMail"), mainProperties.getProperty("fromName"));

		AddAllTo.addAllTo(email, mainProperties.getProperty("mail2Tos"));
		AddAllCC.addAllCC(email, mainProperties.getProperty("mail2Ccs"));

		if (modalidad.equals("D"))
			email.setSubject("ConociendoBA - Pedido Catering - Snacks");
		else
			email.setSubject("ConociendoBA - Pedido Catering");

		String cid = email.embed(ClassLoader.getSystemClassLoader().getResource("coba-mail-footer.jpg"), "Conociendo footer");

		email.setHtmlMsg(Body2.get(cid, modalidad, listListEspecificacionesAlimenticias, listComidaEstandar));

		email.send();
	}

}
